ASP.NET MVC - .NET Framework Part-3 Routing Engine and Routing configuration

 राउटिंग-इंजन और राउटिंग टेबल

जैसा कि हम जानते हैं कि कंट्रोलर MVC एप्लिकेशन का मुख्य हिस्सा है, यह एप्लिकेशन के चीफ या कंट्रोलर के तौर पर काम करता है जो HTTP रिक्वेस्ट को सही 'व्यू' तक भेजता है। लेकिन एक ज़रूरी बात यह समझना है कि एप्लिकेशन कैसे तय करती है कि HTTP रिक्वेस्ट को प्रोसेस करने के लिए कौन सा कंट्रोलर इस्तेमाल होगा।

असल में, जब यूज़र ब्राउज़र को HTTP रिक्वेस्ट भेजता है, तो उस रिक्वेस्ट को वेब सर्वर का राउटिंग-इंजन हैंडल करता है। राउटिंग-इंजन के पास एक राउटिंग टेबल होती है जिसमें अलग-अलग राउट्स की लिस्ट होती है और वह उन राउट्स में से उस राउट को ढूंढता है जिसे यूज़र ने URL में रिक्वेस्ट किया है। राउटिंग-इंजन URL के अलग-अलग हिस्सों का एनालिसिस करता है और उस कंट्रोलर और उसके एक्शन का पता लगाता है जिसे URL में रिक्वेस्ट किया गया है। अब, मान लीजिए कि राउटिंग-इंजन रिक्वेस्ट किए गए कंट्रोलर और एक्शन मेथड को नहीं ढूंढ पाता है। ऐसी स्थिति में, राउटिंग-इंजन एक एक्सेप्शन (exception) देगा और क्लाइंट ब्राउज़र को एरर हैंडलिंग पेज भेजेगा।

प्रोग्रामिंग की भाषा में, ASP.NET MVC एप्लिकेशन में राउटिंग कॉन्फ़िगरेशन के लिए RouteConfig क्लास ज़िम्मेदार होती है। इसमें RegisterRoutes नाम का एक स्टैटिक मेथड होता है जो एप्लिकेशन के सभी राउट्स को RouteCollection ऑब्जेक्ट में रजिस्टर करता है। 

RouteConfig.cs फ़ाइल App_Start फ़ोल्डर में होती है।

using System.Web.Mvc;
using System.Web.Routing;
namespace WebApplication
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

Controller class

एक्शन मेथड, कंट्रोलर क्लास का एक पब्लिक मेथड है जो डेटा या व्यू (ActionResult टाइप का) रिटर्न करता है। यूज़र-डिफ़ाइंड कंट्रोलर एक खास तरह की क्लास होती है जो Controller क्लास से derive होती है। कंट्रोलर का नाम 'Controller' सफ़िक्स के साथ रखना ज़रूरी है। उदाहरण के लिए, Home कंट्रोलर को HomeController लिखा जाएगा।

रूट कॉन्फ़िगरेशन

RouteConfig क्लास फ़ाइल में एक या ज़्यादा MapRoute मेथड होते हैं। इस मेथड का इस्तेमाल रूटिंग टेबल में रूट जोड़ने के लिए किया जाता है। रूटिंग टेबल एक RouteCollection है जिसमें नया रूट जोड़ने के लिए MapRoute मेथड का इस्तेमाल किया जाता है। MapRoute API का क्रम डिफ़ॉल्ट रूट और एप्लीकेशन में डिफाइन किए गए दूसरे रूट तय करने के लिए इस्तेमाल किया जाता है।

MapRoute

अगर हम अलग-अलग रूट के लिए MapRoute मेथड को देखें, तो पाते हैं कि कोई भी MapRoute, रूट सेट अप करने के लिए 3 पैरामीटर लेता है। ये तीन पैरामीटर हैं: name, URL और defaults। 

  • name पैरामीटर में हर रूट को एक यूनिक नाम दिया जाता है, 
  • url पैरामीटर URL पैटर्न देता है, और 
  • defaults पैरामीटर defaults कंट्रोलर, एक्शन और Id पैरामीटर के लिए वैल्यू के बारे में होता है। 
  • name और url स्ट्रिंग टाइप के होते हैं, लेकिन defaults एनॉनिमस टाइप का होता है।

Which Route is selected among RouteCollection?

First Come, First Serve (पहले आओ, पहले पाओ)

ध्यान दें कि MapRoute मेथड में डिफाइन किए गए कंट्रोलर और एक्शन का अस्तित्व तब तक चेक नहीं किया जाता जब तक कि MapRoute मेथड को इनवोक (कॉल) न किया जाए। MapRoute मेथड एक-एक करके क्रम में एग्जीक्यूट होते हैं। अगर कोई MapRoute मेथड सफलतापूर्वक चलता है, तो उसके बाद के सभी MapRoute मेथड छोड़ दिए जाते हैं, यानी एग्जीक्यूट नहीं होते। उदाहरण के लिए, नीचे दिए गए कोड में, Book कंट्रोलर एप्लीकेशन में मौजूद नहीं है, लेकिन एप्लीकेशन ठीक से चलती है क्योंकि "AccountLogin" रूट को एक्सेस करने के बाद, एप्लीकेशन अगले MapRoute मेथड को प्रोसेस नहीं करती है।

using System.Web.Mvc;
using System.Web.Routing;
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
        name: "AccountLogin",
        url: "{controller}/{action}/{name}",
        defaults: new { controller = "Account", action = "Login", name = UrlParameter.Optional }
        );
        routes.MapRoute(
        name: "Book",
        url: "{controller}/{action}/{name}",
        defaults: new { controller = "Book", action = "Search", name = UrlParameter.Optional }
        );
        routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

लेकिन अगर यूज़र https://localhost:44370/book/search URL को एक्सेस करने की कोशिश करता है, तो एक्सेप्शन (exception) आता है। ऐसा इसलिए होता है क्योंकि एप्लीकेशन में Book कंट्रोलर नहीं बनाया गया है।


Next: ASP.NET MVC - .NET Framework Part-4 Global.asax file

टिप्पणियाँ

इस ब्लॉग से लोकप्रिय पोस्ट

Differences between in-process and out-of-process hosting models

Web Fundamental Concepts in Hindi for Beginners - FAQs with their Answers Part-1

Introduction to ASP.NET Core and Web Frameworks